#include <iostream>
#include <unistd.h>
#include <csignal>
using namespace std;

// 在多进程的服务程序中，如果子进程收到退出信号，子进程自行退出，如果父进程收到退出信号，则应该先向全部的子进程发送退出信号，然后自己再退出。

void FathExit(int sig); // 父进程的信号处理函数
void ChldExit(int sig); // 子进程的信号处理函数

int main()
{
	// 忽略全部的信号，不希望被打扰
	for(int ii=1;ii<=64;ii++) signal(ii, SIG_IGN);

	// 设置信号，在shell状态下 可以用“kill 进程号” 或 “ctrl+c”正常终止进程
	// 但轻不要用“kill -9 进程号”强行终止
	
	signal(SIGTERM, FathExit);  // SIGTERM 15 对应 kill 进程号
	signal(SIGINT, FathExit);  // SIGINT 2   对应 ctrl+c

	while(true)
	{
		if(fork()>0) // 父进程的流程
		{
			// 每5s创建1个子进程
			sleep(5);
			continue;
		}else // 子进程的流程
		{
			// 子进程需要重新设置信号
			signal(SIGTERM, ChldExit); //子进程需要支持：kill 进程号 
			signal(SIGINT, SIG_IGN);// 子进程不需要捕获SIGINT(即ctrl+c)信号
			
			while(true)
			{
				cout << "子进程" << getpid() << "正在运行中。。。" << endl;
				sleep(3);
				continue;
			}

		}
	}
}

// 父进程的信号处理函数
void FathExit(int sig)
{
	// 以下代码是为了防止信号处理函数在执行过程中，再次被信号中断
	signal(SIGINT, SIG_IGN);
	signal(SIGTERM, SIG_IGN);

	cout << "父进程: " << getpid() << " 退出, sig=" << sig << endl;

	kill(0, SIGTERM); // 向全部子进程发送15的信号，通知他们退出

	// 在这里增加释放资源的代码（全局的资源）
	
	exit(0);
}

// 子进程的信号处理函数
void ChldExit(int sig)
{
	// 以下代码是为了防止信号处理函数在执行过程中，再次被信号中断
	signal(SIGINT, SIG_IGN);
	signal(SIGTERM, SIG_IGN);
    
	cout << "子进程：" << getpid() << " 退出, sig=" << sig << endl;

	// 在这里增加释放资源的代码（只释放子进程的资源）
	
	exit(0);
}






